﻿using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace Com.Lancetinc.Evs.Helpers
{
    public static class MediaElementBaseHelper
    {
        public static void CaptureImage(BitmapSource bitmapSource, string saveFileName, int outputWidth, double rotationAngle = 0)
        {
            // 缩放
            if (Math.Abs(bitmapSource.PixelWidth - outputWidth) > 0.1)
            {
                double scale = outputWidth / (double)bitmapSource.PixelWidth;
                bitmapSource = new TransformedBitmap(bitmapSource, new ScaleTransform(scale, scale, 0, 0));
                if (rotationAngle > 0)
                {
                    bitmapSource = new TransformedBitmap(bitmapSource, new RotateTransform(rotationAngle));
                }
            }

            // 建立图像解码器。类型为jpeg
            BitmapEncoder encoder = new JpegBitmapEncoder();
            // 将当前渲染器中渲染位图作为一个位图帧加入解码器，进行解码，取得数据流。
            encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
            // 建立内存流，将得到解码图像流写入内存流。
            var stream = new MemoryStream();
            encoder.Save(stream);
            {
                //保存图片
                File.WriteAllBytes(saveFileName, stream.ToArray());
            }
        }

        public static void CaptureImage(MediaElement mediaElement, string saveFileName, int outputWidth)
        {
            BitmapSource bitmap = CaptureImage(mediaElement);
            CaptureImage(bitmap, saveFileName, outputWidth);
        }

        public static BitmapSource CaptureImage(MediaElement mediaElement)
        {
            // 建立目标渲染图像器，高度为前台控件实显高度，此处不能使用.width或.height属性，否则出现错误。
            // 为了避免图像抓取出现黑边现象，需要对图象进行重新测量及缩放
            RenderTargetBitmap bitmap = new RenderTargetBitmap((int)mediaElement.ActualWidth, (int)mediaElement.ActualHeight, 96, 96, PixelFormats.Default);
            //VideoCaptureElement的Stretch="Fill"
            //  mediaElement.Measure(mediaElement.RenderSize);
            //  mediaElement.Arrange(new Rect(mediaElement.RenderSize));
            // 指定图像渲染目标
            bitmap.Render(mediaElement);
            return bitmap;
        }
    }
}
